package ar.maikoova.modelsControllers;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
import java.util.Vector;

import ar.maikoova.bd.Conector;
import ar.maikoova.bd.ParametrosConexion;
import ar.maikoova.models.Cuota;
import ar.maikoova.models.UnidadFuncional;



public class UnidadFuncionalController {

	Conector c;
	Connection conexion;
	
	
	public int insert (UnidadFuncional unidadFuncional) throws SQLException{
		//inseta una nueva unidad fucnional perteneciente a un proyecto
		try{
			c = new Conector(ParametrosConexion.getParametros());
			conexion = c.getConnection();
			CallableStatement cs = conexion.prepareCall("{ call dbo.unidadFuncionalCargar (?, ?, ?, ?, ?, ?, ?, ?)}");
			
			cs.setString(1, unidadFuncional.getCodigo());
			cs.setString(2, unidadFuncional.getCodigoProyectoPadre());
			cs.setInt(3, unidadFuncional.getInversorUnidadFuncional().getNumeroCliente());
			cs.setString(4, unidadFuncional.getFormaPagoUnidadFuncional());
			cs.setFloat(5, unidadFuncional.getEstimadoUnidadFuncional());
			cs.setFloat(6, unidadFuncional.getPorcentajeUnidadFuncional());
			cs.setInt(7, unidadFuncional.getDimensionUnidadFuncional());
			cs.registerOutParameter(8, Types.INTEGER);
			cs.execute();
			return cs.getInt(8);
			//retorna 1 en caso exitoso, 0 si no puede insertar
		}catch(Exception e){
			System.out.println("Consulta erronea");
			return -1;
			//-1 para error de conexion
		}
		finally{
			conexion.close();
		}
	}


	public int update(UnidadFuncional unidadFuncional) throws SQLException {
		//modifica los datos de una  unidad fucnional perteneciente a un proyecto a partir de su codigo
			try{
				c = new Conector(ParametrosConexion.getParametros());
				conexion = c.getConnection();
				CallableStatement cs = conexion.prepareCall("{ call dbo.unidadesFuncionalActualizar (?, ?, ?, ?, ?, ?, ?, ?)}");
				cs.setString(1, unidadFuncional.getCodigo());
				cs.setString(2, unidadFuncional.getCodigoProyectoPadre());
				cs.setInt(3, unidadFuncional.getInversorUnidadFuncional().getNumeroCliente());
				cs.setString(4, unidadFuncional.getFormaPagoUnidadFuncional());
				cs.setFloat(5, unidadFuncional.getEstimadoUnidadFuncional());
				cs.setFloat(6, unidadFuncional.getPorcentajeUnidadFuncional());
				cs.setInt(7, unidadFuncional.getDimensionUnidadFuncional());
				cs.registerOutParameter(8, Types.INTEGER);
				cs.execute();
				return cs.getInt(8);
				//retorna 1 en caso exitoso, 0 si no puede insertar
			}catch(Exception e){
				System.out.println("Consulta erronea");
				return -1;
				//-1 para error de conexion
			}
			finally{
				conexion.close();
			}
	}
	
	public int delete(UnidadFuncional unidadFuncional) throws SQLException {
		//elimina una unidad funcional a partir de su codigo
		try{
			c = new Conector(ParametrosConexion.getParametros());
			conexion = c.getConnection();
			CallableStatement cs = conexion.prepareCall("{ call dbo.unidadFuncionalEliminar (?, ?)}");
			cs.setString(1, unidadFuncional.getCodigo());
			cs.registerOutParameter(2, Types.INTEGER);
			cs.execute();
			return cs.getInt(2);
			//retorna 1 en caso exitoso, 0 si no puede insertar
		}catch(Exception e){
			System.out.println("Consulta erronea");
			return -1;
			//-1 para error de conexion
		}
		finally{
			conexion.close();
		}
	}

	// setea la fecha del ajuste al aplicarlo, se calcula y actualiza el monto restante
	@SuppressWarnings("finally")
	public Float aplicarAjusteInflacionario(String detalle, Integer idUnidadFuncional) throws SQLException{
		Float resultado = (float)0;
		Float montoRestante = (float)0;
		
		try{
			c = new Conector(ParametrosConexion.getParametros());
			conexion = c.getConnection();
			Statement st = conexion.createStatement();
			

			ResultSet rs = st.executeQuery("SELECT indice FROM IndiceInflacionario where detalle = " + "'"+detalle+"'");
			
			if(rs.next()){

				resultado =  rs.getFloat("indice");

				ResultSet rm = st.executeQuery("select montoRestante from UnidadesFuncional where idUnidadFuncional = " + idUnidadFuncional.toString());
				if(rm.next()){
					montoRestante =  rm.getFloat("montoRestante");
					resultado = montoRestante + montoRestante*(resultado/100);
					
				    PreparedStatement ps = conexion.prepareStatement(
				      "UPDATE UnidadesFuncional SET montoRestante = ? WHERE idUnidadFuncional = ?");
				    ps.setFloat(1, resultado);
					ps.setInt(2, idUnidadFuncional);
					ps.executeUpdate();
					ps.close();
				}else{
					resultado = (float)-1;
				}
			}else{
				resultado = (float)-1;
			}
			 
		}catch(Exception e){
			System.out.println("Consulta erronea");
			resultado = (float) -1;
		}
		finally{
			conexion.close();
			return resultado;
		}		
	}
	

}
